/*
 * title: 全局方法
 * date: 2019-05-15
 * author: wjh
 */

import { MessageBox, Notification, Message } from 'element-ui'

export default {
  install (Vue/* , options */) {
    // 1. 添加全局方法或属性，如:  vue-custom-element
    // Vue.myGlobalMethod = function () {
    //   逻辑...
    // }

    // 2. 添加全局资源：指令/过滤器/过渡等，如 vue-touch
    // Vue.directive('my-directive', {
    //   bind (el, binding, vnode, oldVnode) {
    //     逻辑...
    //   }
    // })

    // 3. 通过全局 mixin方法添加一些组件选项，如: vuex
    // Vue.mixin({
    //   methods: {
    //   逻辑...
    //   }
    // })

    // 4. 添加实例方法，通过把它们添加到 Vue.prototype 上实现
    // Vue.prototype.myMethod = function (option) {
    //   逻辑...
    // }

    /**
     * 个位数补0
     * value：值 数字/字符
     **/
    Vue.prototype.$SET_ZERO = function (value) {
      if (value < 10) {
        return '0' + value
      } else {
        return value
      }
    }

    /**
     * 日期时间转换
     * value：值 时间戳 1557102311707/日期时间 2019-5-6 08:33:16 2019/5/6 08:33:16
     * type：类型 false date/time
     * attr：属性 false '-'或'/' type != time
     **/
    Vue.prototype.$SET_DATE = function (value, type, attr) {
      let date
      if (Number(value)) {
        date = new Date(String(value).length < 12 ? Number(value) * 1000 : Number(value))
      } else {
        return new Date(value).valueOf() || '——'
      }
      let Y = date.getFullYear()
      let M = this.$SET_ZERO(date.getMonth() + 1)
      let D = this.$SET_ZERO(date.getDate())
      let h = this.$SET_ZERO(date.getHours())
      let m = this.$SET_ZERO(date.getMinutes())
      let s = this.$SET_ZERO(date.getSeconds())
      if (type === 'YY') {
        date = Y + `年`
      } else if (type === 'YY-MM') {
        date = Y + (attr || `年`) + M + (attr ? '' : `月`)
      } else if (type === 'YY-MM-DD') {
        date = Y + (attr || `年`) + M + (attr || `月`) + D + (attr ? '' : `日`)
      } else if (type === 'YY-MM-DD hh') {
        date = Y + (attr || `年`) + M + (attr || `月`) + D + (attr ? ' ' : `日`) + ' ' + h + (attr ? '' : `时`)
      } else if (type === 'YY-MM-DD hh:mm') {
        date = Y + (attr || `年`) + M + (attr || `月`) + D + (attr ? ' ' : `日`) + h + (attr ? ':' : `时`) + m + (attr ? '' : `分`)
      } else if (type === 'hh:mm:ss') {
        date = h + (attr ? ':' : `时`) + s + (attr ? ':' : `分`) + s + (attr ? '' : `秒`)
      } else if (type === 'hh') {
        date = h + `时`
      } else if (type === 'MM-DD') {
        date = M + (attr || `月`) + D + (attr ? ' ' : `日`)
      } else {
        date = Y + (attr || `年`) + M + (attr || `月`) + D + (attr ? ' ' : `日`) + h + (attr ? ':' : `时`) + m + (attr ? ':' : `分`) + s + (attr ? '' : `秒`)
      }
      return date
    }

    /**
     * 转对象为字符串
     * value：值 对象
     **/
    Vue.prototype.$SET_STRINGS = function (value) {
      if (typeof value === 'object') {
        return JSON.stringify(value)
      } else {
        return value
      }
    }

    /**
     * 验证正则
     * value：值 手机号/邮箱/身份证号
     * attr：属性 tel/email/ID
     **/
    Vue.prototype.$SET_REGULAR = function (value, attr) {
      let telCs = /^(((13[0-9]{1})|(15[0-9]{1})|(17[0-9]{1})|(18[0-9]{1}))+\d{8})$/
      let emailCs = /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/
      let numberIDCs = /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/
      if (attr === 'tel') {
        value = telCs.test(Number(value))
      } else if (attr === 'email') {
        value = emailCs.test(value)
      } else if (attr === 'ID') {
        value = numberIDCs.test(value)
      }
      return value
    }

    /**
     * 手机号为132*****526
     * value：值 手机号
     **/
    Vue.prototype.$SET_TELHIDE = function (value) {
      let telCs = /^(((13[0-9]{1})|(15[0-9]{1})|(17[0-9]{1})|(18[0-9]{1}))+\d{8})$/
      if (telCs.test(Number(value))) {
        let num = value.toString()
        return num.substring(0, 3) + '*****' + num.substring(num.length - 3)
      }
      return value
    }

    /**
     * CONFIRM确认框（封装Element MessageBox组件）
     * msg：文字
     * title：标题
     **/
    Vue.prototype.$CONFIRM = function (msg = '将批量删除数据, 是否继续?', title = '提示') {
      return new Promise(resolve => {
        MessageBox.confirm(msg, title, {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning',
          showClose: false,
          lockScroll: false
        }).then(() => {
          resolve(true)
        }).catch(() => {
          resolve(false)
        })
      })
    }
    /**
     * Tips提示（封装vant Toast组件）
     * title：文字
     * millisecond：毫秒
     * callback：回调
     **/
    Vue.prototype.$Tips = function (type, msg, title, callback) {
      return new Promise(resolve => {
        // 通知
        Notification({
          type: type || 'info',
          title: title || '标题',
          message: msg || '我也是有脾气的，请刷新一下',
          duration: 2000,
          // showClose: false,
          onClose: () => {
            callback && callback()
          }
        })
        // 提示
        // Message({
        //   type: type || 'info',
        //   message: msg || '我也是有脾气的，请刷新一下',
        //   duration: 2000,
        //   // showClose: false,
        //   onClose: () => {
        //     callback && callback()
        //   }
        // })
      })
    }

    /**
     * 表单验证
     * verifications：验证判断提示
     * values：form表单项
     * callback：回调
     **/
    Vue.prototype.$FORM_VERIFICATIONS = function (verifications, values, callback) {
      let infos = ''
      if (typeof verifications === 'function') {
        for (let name in values) {
          infos = verifications(name, values[name])
          if (infos) {
            return infos
          }
        }
        if (!infos) {
          callback && callback()
        }
      }
      return infos
    }

    Vue.prototype.$oninput = function (value) {
      let str = (value && value.split('')) || []
      let reg1 = /\d/
      let reg2 = /\./
      // 第一个字符不能为小数点
      if (str[0] === '.') {
        return value = ''
      }
      // 第一个字符与第二个字符不能为00
      if (str[0] === '0' && str[1] === '0') {
        return value = '0'
      }
      // 过滤掉除数字和小数点外的字符
      value = str.filter((e) => reg1.test(e) || reg2.test(e))
      // 匹配小数点后只能有两位小数
      let valJoin = value.join('')
      return value = valJoin.match(/^\d*(\.?\d{0,2})/g)[0] || null
    }
  }
}
